package com.xuecheng.content.controller;

import com.xuecheng.api.content.model.CourseBaseApi;
import com.xuecheng.api.content.model.dto.CourseBaseDTO;
import com.xuecheng.api.content.model.qo.QueryCourseBaseModel;
import com.xuecheng.api.content.model.vo.CourseBaseVO;
import com.xuecheng.common.domain.page.PageRequestParams;
import com.xuecheng.common.domain.page.PageVO;
import com.xuecheng.common.util.SecurityUtil;
import com.xuecheng.content.convert.CourseBaseConvert;
import com.xuecheng.content.entity.CourseBase;
import com.xuecheng.content.service.CourseBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 课程基本信息 前端控制器
 * </p>
 *
 * @author itcast
 */
@Slf4j
@RestController  //todo 该注解将后端返回的数据转成json格式响应给前端
public class CourseBaseController implements CourseBaseApi {

    @Autowired
    private CourseBaseService  courseBaseService;
    @GetMapping("/all")
    public List<CourseBase> testQueryAll() {
        List<CourseBase> list = courseBaseService.list();
        return  list;
    }

    @Override
    @PostMapping("/course/list")
    /**todo 课程分页条件查询
     * 第一个参数封装的的是要查寻得页数和每页条数,
     * 第二个参数封装的是分页查询的条件,根据课程状态还是课程审核状态
     * 第二个参数加@RequestBody 注解的原因
     *     因为SpringMvc默认的传参风格是
     *        QueryString(问号传参) 就是跟在路径后面参数和路径之间用?隔开
     *        但是
     *          第二参数传参风格是RequestBody
     *              参数放在请求体中 因此需要加@RequestBody 注解
     *  todo 注意: 这两个参数在这里使用有一个前提,
     *    参数里封装的  属性名称 必须 和  前端传入参数(json格式传参)的  key值名称 保持一致
    */
     public PageVO queryCourseBaseList(PageRequestParams params,
                                       @RequestBody QueryCourseBaseModel model) {
         //todo SecurityUtil对前端传入的请求数据进行了封装,getCompanyId获取每个请求的独有id,然后传入后端获取独有的数据,从而实现数据分隔,保护彼此数据安全性
        Long companyId = SecurityUtil.getCompanyId();

        PageVO pageVO = courseBaseService.queryCourseBaseList(params, model,companyId);
        return pageVO;
    }

//todo 课程新增
    @Override
    @PostMapping("/course")
    public CourseBaseDTO creatCourseBase(@RequestBody CourseBaseVO courseBaseVO) {
 //todo 1将 vo 转 dto
        CourseBaseDTO dto = CourseBaseConvert.INSTANCE.vo2dto(courseBaseVO);
  //todo 2 SecurityUtil对前端传入的请求数据进行了封装,getCompanyId获取每个请求的独有id,然后传入后端获取独有的数据,从而实现数据分隔,保护彼此数据安全性
        Long companyId = SecurityUtil.getCompanyId();
        dto.setCompanyId(companyId);  //将机构id添加进去
        //todo 调用方法完成课程基本信息添加
        CourseBaseDTO courseBaseDTO = courseBaseService.creatCourseBase(dto);
        return courseBaseDTO;
    }


//todo 根据id修改课程数据
    @Override
    @GetMapping("/course/{courseBaseId}")
    public CourseBaseDTO getById(@PathVariable Long courseBaseId) {
        //todo SecurityUtil对前端传入的请求数据进行了封装,getCompanyId获取每个请求的独有id,然后传入后端获取独有的数据,从而实现数据分隔,保护彼此数据安全性
        Long companyId = SecurityUtil.getCompanyId();
        CourseBaseDTO courseById = courseBaseService.getCourseById(courseBaseId, companyId);

        return courseById;
    }
//todo 修改根据页面数据修改课程信息
    @Override
    @PutMapping("/course")
    public CourseBaseDTO modifyCourseResult(@RequestBody CourseBaseVO courseBaseVO) {
         //将前端传的vo类型数据转成dto,service层只接收dto数据
        CourseBaseDTO courseBaseDTO = CourseBaseConvert.INSTANCE.vo2dto(courseBaseVO);
        //todo SecurityUtil对前端传入的请求数据进行了封装,getCompanyId获取每个请求的独有id,然后传入后端获取独有的数据,从而实现数据分隔,保护彼此数据安全性
        Long companyId = SecurityUtil.getCompanyId();
        courseBaseDTO.setCompanyId(companyId);
        CourseBaseDTO dto = courseBaseService.modifyCourseResult(courseBaseDTO);
        return dto;
    }

    @Override
    @DeleteMapping("/course/{courseBaseId}")
    public void removeCourseBase(@PathVariable Long courseBaseId) {
        //todo SecurityUtil对前端传入的请求数据进行了封装,getCompanyId获取每个请求的独有id,然后传入后端获取独有的数据,从而实现数据分隔,保护彼此数据安全性
        Long companyId = SecurityUtil.getCompanyId();
        courseBaseService.removeCourseBase(courseBaseId,companyId);
    }


    @GetMapping("/course/commit/{courseBaseId}")
    public void submitCourseBase(@PathVariable Long courseBaseId) {
        //todo SecurityUtil对前端传入的请求数据进行了封装,getCompanyId获取每个请求的独有id,然后传入后端获取独有的数据,从而实现数据分隔,保护彼此数据安全性
        Long companyId = SecurityUtil.getCompanyId();
           courseBaseService.submitCourseBase(courseBaseId,companyId);
    }
}
